﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FrbaCommerce.Abm_Rol
{
    public partial class AbmRol : Form
    {
        Rol rol;        
        public AbmRol(Rol rol, bool modo)
        {
            InitializeComponent();  
            this.rol = rol;
            this.cmbFuncion.DisplayMember = "Descripcion";
            this.cmbFuncion.ValueMember = "Id";
            this.cmbFuncion.SelectedValue = -1;
            this.CargarFuncionalidades();
            if (rol.id != 0)
            {                
                CargarRol();
            }
            if (modo)
            {
                this.txtNombreRol.Enabled = false;
                label2.Text = "A los roles estandar no se les puede modificar el nombre";
            }          
        }
      
        private void AbmRol_Load(object sender, EventArgs e)
        {
            
        }

        private void CargarFuncionalidades() 
        {
            Funcionalidad funcion = new Funcionalidad();
            funcion.CargarComboFuncionalidad(cmbFuncion);            
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (ValidarCamposIngresados())
            {
                this.LlenarRol();
                if (this.rol.id == 0)
                {
                    if (MessageBox.Show("¿Está seguro que desea dar de alta el Rol?", "Rol", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {                        
                        this.rol.Guardar(rol.nombre, rol.habilitado);
                        this.rol.getDatosPorNombre(rol.nombre);
                        FuncionalidadRol f = new FuncionalidadRol();
                        f.GuardarFuncion_Rol(this.rol);
                        MessageBox.Show("Los datos han sido ingresados al sistema.", "Confirmacion", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                }
                else
                {
                    if (MessageBox.Show("¿Está seguro que desea modificar el Rol?", "Rol", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        this.rol.Modificar(rol.nombre, rol.habilitado, rol.id);
                        rol.getDatosPorNombre(rol.nombre);
                        FuncionalidadRol f = new FuncionalidadRol();
                        f.BorrarFuncionalidades(this.rol.id);
                        f.GuardarFuncion_Rol(this.rol);
                        MessageBox.Show("Los datos han sido ingresados al sistema.", "Confirmacion", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }               
                }

            }
        }

        private void LlenarRol()
        {
            this.rol.nombre = txtNombreRol.Text;
            this.rol.habilitado = true;
        }

        private void CargarRol()
        {
            txtNombreRol.Text = this.rol.nombre;            
            Funcionalidad f = new Funcionalidad();
            rol.Funcionalidades = f.buscarFuncionalidadesDeRol(rol.id);
            this.dgvFuncionalidades.DataSource = rol.Funcionalidades;
            foreach (Funcionalidad func in rol.Funcionalidades)
            {
                cmbFuncion.Items.Remove(func.descripcion);
            }
        }

        private bool ValidarCamposIngresados()
        {
            bool invalido = true;
            if (txtNombreRol.Text == "")
            {
                MessageBox.Show("Ingrese el nombre del rol a Guardar", "Error",MessageBoxButtons.OK, MessageBoxIcon.Error);
                invalido = false;
            }
            
            if (dgvFuncionalidades.ColumnCount == 0)
            {
                invalido = false;
                MessageBox.Show("Debe seleccionar alguna funcionalidad.\n", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            return invalido;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void lnkAgregar_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (cmbFuncion.SelectedItem != null)
            {
                List<Funcionalidad> funcionalidades = (List<Funcionalidad>)this.dgvFuncionalidades.DataSource;
                Funcionalidad funcionalidad = new Funcionalidad();
                funcionalidad.descripcion = cmbFuncion.SelectedItem.ToString();
                funcionalidad.id = funcionalidad.ObtenerID(funcionalidad.descripcion);
                if (dgvFuncionalidades.ColumnCount != 0)
                {
                    if (!funcionalidades.Contains(funcionalidad))
                    {
                        this.rol.Funcionalidades.Add(funcionalidad);
                    }
                }
                else
                {
                    this.rol.Funcionalidades.Add(funcionalidad);
                }

                this.rol.Funcionalidades = this.rol.Funcionalidades.OrderBy(r => r.id).ToList();                
                this.dgvFuncionalidades.DataSource = this.rol.Funcionalidades;
                cmbFuncion.Items.Remove(cmbFuncion.SelectedItem);                
            }
            else
            {
                MessageBox.Show("Debe seleccionar alguna funcionalidad.\n", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void lklEliminar_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            if (this.dgvFuncionalidades.SelectedCells.Count > 0)
            {
                Funcionalidad f = (Funcionalidad)this.dgvFuncionalidades.SelectedCells[0].OwningRow.DataBoundItem;
                this.cmbFuncion.Items.Add(f.descripcion);
                this.rol.Funcionalidades.Remove((Funcionalidad)this.dgvFuncionalidades.SelectedCells[0].OwningRow.DataBoundItem);
                dgvFuncionalidades.DataSource = null;
                dgvFuncionalidades.DataSource = this.rol.Funcionalidades;                
            }
            else
            {
                MessageBox.Show("Debe seleccionar alguna funcionalidad.\n", "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }        
    }
}
